package com.zjl.redis.第04章_事务_管道_发布订阅;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import redis.clients.jedis.JedisSentinelPool;

import java.util.List;
import java.util.Map;

/**
 * 什么是发布和订阅。
 * Redis发布订阅(pub/sub)是一种消息通信模式:
 * 发送者(pub) 发送消息,订阅者(sub)接收消息。
 * Redis客户端可以订阅任意数量的频道。
 *
 */
public class C_发布与订阅 {
    /**
     * pattern 模式   可以用 a*  通配符
     * channel 指定   只能确定某个频道
     *
     * psubscribe pattern1 [pattern2 ...]//订阅 pattern1 模式的频道
     * subscribe channel1 [channel2 ...]//订阅 channel1 频道
     *
     * pubsub CHANNELS  活跃的，可以查看活跃的频道
     * pubsub NUMSUB channel1 [channel2 ...]  查看指定channel频道有多少订阅者
     * pubsub NUMPAT 只统计使用PSUBSCRIBE命令执行的，返回客户端订阅的唯一模式的数量
     *
     * publish channel1 hello//向 channel1 频道发送一个hello
     * punsubscribe pattern1 [pattern2 ...]//退订给定模式的频道
     * unsubscribe channel1 [channel2 ...]//退订给定的频道
     *
     */
    public static void main(String[] args) {
        Jedis redis = RedisUtil.getRedisPool();
    }
    @Test
    public void 发布() throws InterruptedException {
        Jedis redis = RedisUtil.getRedisPool();
        long f1 = redis.publish("f1", "666");
        System.out.println(f1);//返回有多少人订阅

    }
    @Test
    public void 订阅() throws InterruptedException {
        Jedis redis = RedisUtil.getRedisPool();
        RedisSubscriber subscriber = new RedisSubscriber();
        redis.subscribe(subscriber,"f1");//订阅频道  f*

//        redis.psubscribe(subscriber,"f*");//订阅模式  f1 f2 f11 等等相关f开头的
//        redis.psubscribe(subscriber,"f?");
        Thread.sleep(100000);
    }
    @Test
    public void 查看() throws InterruptedException {
        Jedis redis = RedisUtil.getRedisPool();
        List<String> strings = redis.pubsubChannels();
        System.out.println(strings);

        Long aLong = redis.pubsubNumPat();//返回订阅 模式 的个数
        System.out.println(aLong);

        //返回指定 频道订阅的数量
        Map<String, Long> stringLongMap = redis.pubsubNumSub("f1", "f2");
        System.out.println(stringLongMap);

    }
}
class RedisSubscriber extends JedisPubSub{

    /**
     * 发布订阅后 由此方法接受消息
     * @param channel  订阅的 key
     * @param message  发来的消息
     */
    public void onMessage(String channel, String message) {
        System.out.println(channel + ":" + message);
    }
    public void onSubscribe(String channel, int subscribedChannels) {
        System.out.println(channel + ":" + subscribedChannels);
    }
    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println(channel + ":" + subscribedChannels);
    }
}
